export {}
// 定义Includes类型：第一个参数数组Arr，第二个参数进行判断的值O。
// O在Arr中能够找到完全相同的值，则为true，否则为false
// 首先定义一个判断相同的类型
type Equal<T, U> = (<X>() => X extends T ? true : false) extends 
  (<X>() => X extends U ? true : false)
  ? true
  : false;
// X extends T[number] ? true :false;这样的T[number]无法分解出单独的每项，需要使用数组的解构
// 关于数组的解构[infer X, ...infer Y],这样递归结构，可以通过X可以逐一获得数组的每项
type Includes<T extends unknown[], U> = T extends [infer X, ...infer Y] ? 
    Equal<X, U> extends true ? true : Includes<Y, U>: false; 


type test1 = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Kars'>; // true
type test2 = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Lars'>; // false
type test3 = Includes<[boolean, 2, 3, 5, 6, 7], false>; //false
type test3_1 = Includes<[false, 2, 3, 5, 6, 7], false>; //true
type test4 = Includes<[{ a: 'A' }], { readonly a: 'A' }>; //false
type test5 = Includes<[{ readonly a: 'A' }], { a: 'A' }>; //false
type test6 = Includes<[{}], { a: 'A' }>; //false